package com.bnz.proxy;

import com.bnz.dao.UserDao;
import com.bnz.pojo.User;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

//    CGLIB实现的的动态代理模式: （目标对象必须可以继承）
public class UserDaoCglibDynzProxyImpl implements UserDao {

    //1. 创建代理对象
    public UserDao createProxyObject(){
        //1.1 定义Enhancer对象
        Enhancer enhancer = new Enhancer();
        //1.2 定义enhancer的父类
        enhancer.setSuperclass(UserDaoImpl.class);
        //1.3 设置代理对象的回调
        enhancer.setCallback(this);
        //1.4 创建代理对象
        Object o = enhancer.create();
        //1.5 返回
        return (UserDao) o;
    }
    //2. 当我们调用目标方法时，此方法也会自动调用，相当于：jdk动态代理中的invoke()方法
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //2.1 根据调用的方法进行安全性检查
        if(method.getName().equals("query")){
            checkSecurity();
        }
        //2.2 调用目标对象的方法
        return methodProxy.invokeSuper(o,args);
    }

    private void checkSecurity(){
        System.out.println("【CGLIB的动态代理】---》进行安全性检查。。。");
    }

    public void add() {

    }

    public void update() {

    }

    public void delete() {

    }

    public void query() {

    }

    public void updateUser(int uid, double money) {

    }

    public void addUser(User user) {

    }

    public void addUser(User user) {

    }

    public User findById(int id) {
        return null;
    }

    public void update(User user) {

    }

    public void delete(int id) {

    }
}
